home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
tex
/
td187src.lzh
/
LINES.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
25KB
|
818 lines
IMPLEMENTATION MODULE Lines ;
IMPORT mtAppl;
IMPORT Diverses;
IMPORT MagicAES ;
IMPORT MagicVDI ;
IMPORT MagicSys ;
IMPORT MathLib0 ;
IMPORT CommonData ;
IMPORT HelpModule;
IMPORT Undo;
IMPORT Types;
IMPORT Variablen;
FROM OwnBoxes IMPORT WaitForDepress, MousePos;
(**
IMPORT RTD;
**)
TYPE EntryTyp = RECORD
mx , my : INTEGER ;
m : LONGREAL ;
END ;
ListTyp = ARRAY [ 0..29 ] OF EntryTyp ;
ArrayTyp = ARRAY [0..3] OF INTEGER;
VAR ArrowList , LineList : ListTyp ;
DrawMode : INTEGER;
FinalDraw : BOOLEAN;
CONST LArrow = 1 ; LLine = 2 ;
(*-----------------------------------------------------------------------*)
(* Baut zwei Listen auf *)
PROCEDURE Init ( ) ;
BEGIN
WITH ArrowList [ 0 ] DO mx := 1 ; my := 0 ; m := 1.0 END ;
WITH ArrowList [ 1 ] DO mx := 4 ; my := 1 ; m := 1.0 / 4.0 END ;
WITH ArrowList [ 2 ] DO mx := 3 ; my := 1 ; m := 1.0 / 3.0 END ;
WITH ArrowList [ 3 ] DO mx := 2 ; my := 1 ; m := 1.0 / 2.0 END ;
WITH ArrowList [ 4 ] DO mx := 3 ; my := 2 ; m := 2.0 / 3.0 END ;
WITH ArrowList [ 5 ] DO mx := 4 ; my := 3 ; m := 3.0 / 4.0 END ;
WITH ArrowList [ 6 ] DO mx := 1 ; my := 1 ; m := 1.0 / 1.0 END ;
WITH ArrowList [ 7 ] DO mx := 3 ; my := 4 ; m := 4.0 / 3.0 END ;
WITH ArrowList [ 8 ] DO mx := 2 ; my := 3 ; m := 3.0 / 2.0 END ;
WITH ArrowList [ 9 ] DO mx := 1 ; my := 2 ; m := 2.0 / 1.0 END ;
WITH ArrowList [ 10 ] DO mx := 1 ; my := 3 ; m := 3.0 / 1.0 END ;
WITH ArrowList [ 11 ] DO mx := 1 ; my := 4 ; m := 4.0 / 1.0 END ;
WITH ArrowList [ 12 ] DO mx := 0 ; my := 1 ; m := 1.0 END ;
WITH LineList [ 0 ] DO mx := 1 ; my := 0 ; m := 1.0 END ;
WITH LineList [ 1 ] DO mx := 6 ; my := 1 ; m := 1.0 / 6.0 END ;
WITH LineList [ 2 ] DO mx := 5 ; my := 1 ; m := 1.0 / 5.0 END ;
WITH LineList [ 3 ] DO mx := 4 ; my := 1 ; m := 1.0 / 4.0 END ;
WITH LineList [ 4 ] DO mx := 3 ; my := 1 ; m := 1.0 / 3.0 END ;
WITH LineList [ 5 ] DO mx := 5 ; my := 2 ; m := 2.0 / 5.0 END ;
WITH LineList [ 6 ] DO mx := 2 ; my := 1 ; m := 1.0 / 2.0 END ;
WITH LineList [ 7 ] DO mx := 5 ; my := 3 ; m := 3.0 / 5.0 END ;
WITH LineList [ 8 ] DO mx := 3 ; my := 2 ; m := 2.0 / 3.0 END ;
WITH LineList [ 9 ] DO mx := 5 ; my := 4 ; m := 4.0 / 5.0 END ;
WITH LineList [ 10 ] DO mx := 6 ; my := 5 ; m := 5.0 / 6.0 END ;
WITH LineList [ 11 ] DO mx := 1 ; my := 1 ; m := 1.0 / 1.0 END ;
WITH LineList [ 12 ] DO mx := 5 ; my := 6 ; m := 6.0 / 5.0 END ;
WITH LineList [ 13 ] DO mx := 4 ; my := 5 ; m := 5.0 / 4.0 END ;
WITH LineList [ 14 ] DO mx := 2 ; my := 3 ; m := 3.0 / 2.0 END ;
WITH LineList [ 15 ] DO mx := 3 ; my := 5 ; m := 5.0 / 3.0 END ;
WITH LineList [ 16 ] DO mx := 1 ; my := 2 ; m := 2.0 / 1.0 END ;
WITH LineList [ 17 ] DO mx := 2 ; my := 5 ; m := 5.0 / 2.0 END ;
WITH LineList [ 18 ] DO mx := 1 ; my := 3 ; m := 3.0 / 1.0 END ;
WITH LineList [ 19 ] DO mx := 1 ; my := 4 ; m := 4.0 / 1.0 END ;
WITH LineList [ 20 ] DO mx := 1 ; my := 5 ; m := 5.0 / 1.0 END ;
WITH LineList [ 21 ] DO mx := 1 ; my := 6 ; m := 6.0 / 1.0 END ;
WITH LineList [ 22 ] DO mx := 0 ; my := 1 ; m := 1.0 END ;
END Init ;
(* Bemerkung : Die Steigungen Null und Unendlich müssen extra behandelt *)
(* werden. Aus Rechengründen werden die Steigungen auf 1.0 gesetzt. *)
(*-----------------------------------------------------------------------*)
PROCEDURE Real ( x : INTEGER ) : LONGREAL ;
BEGIN
RETURN MathLib0.real ( x ) ;
END Real ;
PROCEDURE Int ( r : LONGREAL ) : INTEGER ;
BEGIN
RETURN Diverses.round ( r ) ;
END Int ;
PROCEDURE Sqrt ( r : LONGREAL ) : LONGREAL ;
BEGIN
RETURN MathLib0.sqrt ( r ) ;
END Sqrt ;
(*-----------------------------------------------------------------------*)
PROCEDURE Compute ( wlist , mode : INTEGER ; VAR xy : ArrayTyp;
VAR mx , my : INTEGER ) ;
VAR x , y , v , h , x1 , y1 , x2 , y2 , i , max : INTEGER ;
m , m1 , m2 : LONGREAL ; null , infi : BOOLEAN ; list : ListTyp ;
BEGIN
IF wlist = LArrow THEN list := ArrowList ; max := 12 ;
ELSE list := LineList ; max := 22 ;
END ;
y := xy [ 3 ] - xy [ 1 ] ;
x := xy [ 2 ] - xy [ 0 ] ;
IF y < 0 THEN v := -1 ELSE v := +1 END ;
IF x < 0 THEN h := -1 ELSE h := +1 END ;
y := y * v ; x := x * h ;
(* Sonderfälle *)
IF ( x * y ) = 0 THEN
IF x = 0 THEN mx := 0 ; my := 1 * v END ;
IF y = 0 THEN mx := 1 * h ; my := 0 END ;
ELSE
m := Real ( y ) / Real ( x ) ;
i := 1 ;
WHILE ( list [ i ].m < m ) AND ( i < max ) DO i := i + 1 END ;
null := FALSE ; infi := FALSE ;
IF list [ i - 1 ].my = 0 THEN null := TRUE END ;
IF list [ i ].mx = 0 THEN infi := TRUE END ;
m1 := list [ i - 1 ].m ;
m2 := list [ i ].m ;
CASE mode OF
1 : (* x fest *)
y1 := Int ( m1 * Real ( x ) ) ;
y2 := Int ( m2 * Real ( x ) ) ;
IF null THEN y1 := 0 END ;
IF infi THEN y2 := y1 END ;
IF ABS ( y - y1 ) < ABS ( y - y2 ) THEN
i := i - 1 ;
xy [ 3 ] := xy [ 1 ] + y1 * v ;
ELSE
i := i ;
xy [ 3 ] := xy [ 1 ] + y2 * v ;
END ;
|
2 : (* y fest *)
x1 := Int ( 1.0 / m1 * Real ( y ) ) ;
x2 := Int ( 1.0 / m2 * Real ( y ) ) ;
IF null THEN x1 := x2 END ;
IF infi THEN x2 := 0 END ;
IF ABS ( x - x1 ) < ABS ( x - x2 ) THEN
i := i - 1 ;
xy [ 2 ] := xy [ 0 ] + x1 * h ;
ELSE
i := i ;
xy [ 2 ] := xy [ 0 ] + x2 * h ;
END ;
|
3 : (* nächster Punkt *)
x1 := Int ( ( Real ( x ) + m1 * Real ( y ) ) /
( 1.0 + m1 * m1 ) ) ;
x2 := Int ( ( Real ( x ) + m2 * Real ( y ) ) /
( 1.0 + m2 * m2 ) ) ;
y1 := Int ( m1 * Real ( x1 ) ) ;
y2 := Int ( m2 * Real ( x2 ) ) ;
IF null THEN x1 := x ; y1 := 0 END ;
IF infi THEN x2 := 0 ; y2 := y END ;
IF Sqrt ( Real ( ( x1 - x ) * ( x1 - x ) +
( y1 - y ) * ( y1 - y ) ) )
<
Sqrt ( Real ( ( x2 - x ) * ( x2 - x ) +
( y2 - y ) * ( y2 - y ) ) )
THEN
i := i - 1 ;
xy [ 2 ] := xy [ 0 ] + x1 * h ;
xy [ 3 ] := xy [ 1 ] + y1 * v ;
ELSE
i := i ;
xy [ 2 ] := xy [ 0 ] + x2 * h ;
xy [ 3 ] := xy [ 1 ] + y2 * v ;
END ;
END ;
mx := list [ i ].mx * h ;
my := list [ i ].my * v ;
END ;
END Compute ;
(*-----------------------------------------------------------------------*)
PROCEDURE MergeToSubpic(LastNormalObject : Types.ObjectPtrTyp);
(*
Faßt alle Objekte HINTER LastNormalObject zu einem Subpicture zusammen
*)
VAR mycode : Types.CodeAryTyp;
temp : Types.ObjectPtrTyp;
i : INTEGER;
mxx, mxy,
mnx, mny : INTEGER;
init : BOOLEAN;
surround : ArrayTyp;
BEGIN
(*
PDebug.Into('Merge');
*)
IF LastNormalObject<>NIL THEN
temp := LastNormalObject^.Next;
init := TRUE;
WHILE temp<>NIL DO
IF NOT init THEN
IF (temp^.Surround[0]< mnx ) THEN mnx := temp^.Surround[0]; END;
IF (temp^.Surround[1]> mxy ) THEN mxy := temp^.Surround[1]; END;
IF (temp^.Surround[0] + temp^.Surround[2]> mxx ) THEN
mxx := temp^.Surround[0] + temp^.Surround[2];
END;
IF (temp^.Surround[1] - temp^.Surround[3]< mny ) THEN
mny := temp^.Surround[1] - temp^.Surround[3];
END;
ELSE
init := FALSE;
mnx := temp^.Surround[0];
mxx := temp^.Surround[0] + temp^.Surround[2];
mny := temp^.Surround[1] - temp^.Surround[3];
mxy := temp^.Surround[1];
END;
temp :=